/**
 *  选择排序
 *  和
 *  冒泡排序
 */
public class L_1_5andL_1_6 {

    /**
     * 选择排序
     * 一列数组中,每次选择
     * @param arr
     */
    public static void selectSort(int[] arr) {
        if(arr==null || arr.length<2)
            return ;

        for (int i = 0; i < arr.length; i++) {
            int min = i;
            for (int j = i; j < arr.length; j++) {
                min = arr[min] > arr[j] ? j : min;
            }
            swap(arr,i, min);
        }
    }

    /**
     * 冒泡排序
     *
     * @param arr
     */
    public static void bubbleSort(int[] arr) {
        if(arr==null || arr.length<2)
            return ;
        for (int i = arr.length; i > 0; i--) {
            for (int j = 1; j < i; j++) {
                if (arr[j-1] > arr[j]) {
                    swap(arr,j-1,j);
                }
            }
//            System.out.println("i-->" + i);

        }
    }

    /**
     * 插入排序
     *
     * @param arr
     */
    public static void insertSort(int[] arr) {
        if(arr==null || arr.length<2)
            return ;
        for (int i = 0; i < arr.length; i++) {
            int max = i;
            //for循环优化后,把判断条件写入for的第二判断语句中,执行只需要调换值就可以了
            for (int j = i; j > 0 && arr[j] < arr[j-1]; j--) {
                    swap(arr,j,j-1);

            }
        }
    }


    public static void swap(int[] arr, int num1, int num2){
        //通过异或对数组元素进行调换
        arr[num1] = arr[num1] ^ arr[num2];
        arr[num2] = arr[num1] ^ arr[num2];
        arr[num1] = arr[num1] ^ arr[num2];
//        int temp = arr[num1];
//        arr[num1] = arr[num2];
//        arr[num2] = temp;
    }

    public static void printArr(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i]+" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {

        int[] arr = {9,6,7,8,4,2,1,5,3,0};

        printArr(arr);

        insertSort(arr);

        printArr(arr);

    }
}
